import numpy as np
import matplotlib.pyplot as plt
from scipy.io import loadmat
from RSCNv1_0 import RSCN
# SCN 数据回归演示
# 清除变量和关闭所有图形（在 Python 中不需要）

# 准备训练数据 (X, T) 和测试数据 (X2, T2)
# X：每个行向量代表一个样本输入
# T：每个行向量代表一个样本目标
# X2 和 T2 同理
# 注意：在运行程序之前应进行数据预处理（归一化）

#data = loadmat('Demo_Data.mat')
data = np.load('MG_Data.npy').T


m = 800
data =data.reshape((-1, 1))
X = data[0:m-1,:]
T = data[1:m,:]


test_x = data[m:-1,:]
test_y = data[m+1:,:]

# 绘制训练和测试数据
# plt.figure()
# plt.plot(X, T, 'r.-', label='Training')
# plt.plot(X2, T2, 'b.-', label='Test')
# plt.legend()
# plt.show()

# 参数设置
L_max = 250                     # 最大隐藏节点数
tol = 0.003                     # 训练容差
T_max = 200                     # 最大候选节点数
Lambdas = [0.5, 1, 5, 10,
           30, 50, 100, 150, 200, 250]  # 随机权重范围序列
r = [0.9, 0.99, 0.999,
     0.9999, 0.99999, 0.999999]         # 1-r 收缩序列
nB = 1       # 批量大小

# 模型初始化
M = RSCN(L_max=L_max, T_max=T_max, tol=tol, Lambdas=Lambdas, r=r, nB=nB)

# 模型训练
# M 是训练后的模型
# per 包含随着 L 增加的训练误差
per = M.Regression(X, T)
print(f'最终模型隐藏节点数：{M.L}')
print(f'最终训练误差（NRMSE）：{M.COST}')

# 训练误差演示
plt.figure()
plt.plot(per['Error'], 'r.-', label='Training RMSE')
plt.xlabel('L')
plt.ylabel('RMSE')
plt.legend()
plt.show()

# 训练数据上的模型输出与目标对比
O1 = M.GetOutput(X , test_x, test_y.size)
plt.figure()
plt.plot(range(test_y.size), test_x, 'r.-', label='Training Target')
plt.plot(range(test_y.size), O1, 'b.-', label='Model Output')
plt.xlabel('X')
plt.ylabel('Y')
plt.legend()
plt.show()

# 测试数据上的模型输出与目标对比
# O2 = M.GetOutput(X2)
# plt.figure()
# plt.plot(X2, T2, 'r.-', label='Test Target')
# plt.plot(X2, O2, 'b.-', label='Model Output')
# plt.xlabel('X')
# plt.ylabel('Y')
# plt.legend()
# plt.show()

# 结束
